package com.jinxin.platform.cdsideparkmgr.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * All rights Reserved, Designed By www.beonelot.com
 *
 * @version: V1.0
 * @Copyright: www.beonelot.com Inc. All rights reserved.
 * @Description：
 * @Date: 2021-11-30
 * @Author: Lingnan
 **/
// 不能通过@Autowired等注入bean
@ServerEndpoint("/cdsideparkmgr/websocket/{userId}")
@Component
@Slf4j
public class CdsideparkmageWebSocket {
    /**
     * 存放所有在线的客户端
     */
    public static final Map<String, Session> clients = new ConcurrentHashMap<>();
    /**
     * 连接建立成功调用的方法
     *
     * @param session 可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(@PathParam("userId") String userId, Session session) {
        /*
         * 存放所有在线的客户端
         */
        log.info("[路边停车]有新连接加入：{}", userId);
        clients.put(userId, session);
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("userId") String userId, Session session) {
        clients.remove(userId);
        log.info("[路边停车]onClose,{}", userId);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param userId 用户ID
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(@PathParam("userId") String userId, String message) {
        log.info("[路边停车]{}发送信息,内容为{}", userId, message);
    }
    /**
     * 发生错误时调用
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(@PathParam("userId") String userId, Session session, Throwable error) {
        log.error("[路边停车]发生错误,{}", userId);
        error.printStackTrace();
    }

    /**
     * 群发消息
     *
     * @param message 消息内容
     */
    public void sendMessage(String message) {
        for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
            Session toSession = sessionEntry.getValue();
            log.info("[路边停车]服务端给客户端[{}]发送消息{},", sessionEntry.getKey(), message);
            if (toSession.isOpen()) {
                toSession.getAsyncRemote().sendText(message);
            }
        }
    }

    public void sendMessageToUser(String userId, String message) {
        Session toSession = clients.get(userId);
        log.info("[路边停车]sendMessageToUser[{}]发送消息{},", userId, message);
        toSession.getAsyncRemote().sendText(message);
    }

}
